home *** CD-ROM | disk | FTP | other *** search
/ The Amiga Classic Collection / The Amiga Classic Collection - Disc 1.iso / Education / ED16-CrosswordCreator.DMS / ED16-CrosswordCreator.adf / Source / Cross.mod < prev    next >
Text File  |  1991-07-13  |  25KB  |  792 lines

  1. (***************************************************************************
  2.  :Program.    Cross
  3.  :Author.     Jürgen Weinelt
  4.  :Address.    Zur Kanzel 1, D-8783 Hammelburg, Germany
  5.  :Version.    V4.1
  6.  :Copyright.  Freeware; copy it, but don't sell it!
  7.  :Language.   Modula-II
  8.  :Translator. M2Amiga V4.096d
  9.  :Imports.    CPCDosIO
  10.  :Imports.    CPCMenu
  11.  :Imports.    CPCGlobal
  12.  :Imports.    CPCPrint
  13.  :Imports.    CPCRequesters
  14.  :Imports.    CPCSleep
  15.  :Imports.    CrossFont
  16.  :Imports.    FileReq
  17.  :Contents.   Program to create crossword puzzles.
  18.  :Contents.   Features Intuition interface, filerequesters, and a special
  19.  :Contents.   message data file to allow easy translation into any
  20.  :Contents.   (human) language without changing the source code.
  21.  :History.    V3.2  08-jan-91  first major release of M2 version on AMOK
  22.  :History.    V3.3  06-feb-91  PAL/NTSC support added, released on fish 464
  23.  :History.    V3.4  22-may-91  new compiler version 4.096d
  24.  :History.    V3.5  28-jun-91  still struggling with compiler 4.096d
  25.  :History.    V3.5A 09-jul-91  intermediate version, limited circulation
  26.  :History.    V4.0  04-aug-91  many new features
  27.  :History.    V4.1  15-aug-91  bug fixes, major release
  28.  **************************************************************************)
  29.  
  30.  
  31.  
  32. MODULE Cross;
  33.  
  34.  
  35.  
  36. IMPORT Arguments;
  37. IMPORT Arts;
  38. IMPORT Break;
  39. IMPORT Conversions;
  40. IMPORT CPCDosIO;
  41. IMPORT CPCMenu;
  42. IMPORT CPCGlobal;
  43. IMPORT CPCPrint;
  44. IMPORT CPCRequesters;
  45. IMPORT CPCSleep;
  46. IMPORT GraphicsL;
  47. IMPORT InOut;
  48. IMPORT IntuiIO;
  49. IMPORT IntuitionD,IntuitionL;
  50. IMPORT R;
  51. IMPORT RandomNumber;
  52. IMPORT String;
  53. IMPORT SYSTEM;
  54.  
  55.  
  56.  
  57. CONST
  58.  progtitle="Cross V4.1 *** ©1991 by J.Weinelt";
  59.  underl   ="---------------------------------";
  60.  spcs="                                                                           ";
  61.  limitbase=10;
  62.  lowerylimit=5;
  63. (* upperylimit=35; !!! now VAR: PAL/NTSC support added 06-feb-91 !!! *)
  64. (* defmsgline=27;  ^^^ same as above ^^^ *)
  65.  defxsize=25;
  66.  defysize=25;
  67.  lowerxlimit=5;
  68.  upperxlimit=39;
  69.  maxRetry=5000;
  70.  
  71.  
  72. TYPE
  73.  direction=(horizontal,vertical);
  74.  
  75.  
  76.  
  77. VAR
  78.  dir0: direction;
  79.  w,progname,tmp: CPCGlobal.String;
  80.  loop,word,wlen,x,y,cmp,num: INTEGER;
  81.  xloop,yloop,x0,y0,w0,len0,outerloop: INTEGER;
  82.  val0,tempH,tempV: INTEGER;
  83.  doH,booldummy: BOOLEAN;
  84.  limit,dummy,narg,msgline: INTEGER;
  85.  sec,micro: LONGINT;
  86.  msgmd: CPCDosIO.MsgMode;
  87.  scrname: CPCGlobal.LString;
  88.  ibase: IntuitionD.IntuitionBasePtr;
  89.  pal,lace: BOOLEAN;
  90.  upperylimit,defmsgline: INTEGER;
  91.  intuiHeight: INTEGER;
  92.  
  93.  
  94.  
  95. PROCEDURE TestH(VAR w: ARRAY OF CHAR; x,y,len,rlen,ref: INTEGER): INTEGER;
  96.  VAR
  97.   v{R.D6},loop{R.D7}: INTEGER;
  98.  BEGIN
  99.   IF (x+len<=CPCGlobal.xmax) AND (CPCGlobal.text[x-1,y]="\o") AND (CPCGlobal.text[x+len+1,y]="\o") THEN
  100.    v:=0;
  101.    FOR loop:=x TO x+len DO
  102.     IF (w[loop-x]=CPCGlobal.text[loop,y]) THEN
  103.      INC(v);
  104.      IF (CPCGlobal.text[loop-1,y]#"\o") OR (CPCGlobal.text[loop+1,y]#"\o") THEN
  105.       RETURN -1;
  106.      END;
  107.     ELSE
  108.      IF (CPCGlobal.text[loop,y-1]#"\o") OR (CPCGlobal.text[loop,y+1]#"\o") OR (CPCGlobal.text[loop,y]#"\o") THEN
  109.       RETURN -1;
  110.      END;
  111.     END;
  112.    END;
  113.    IF (v>ref) OR
  114.       ((v=ref) AND (ref>0) AND ((len>rlen) OR
  115.                                ((len=rlen) AND (RandomNumber.RND(10)<2)))) THEN
  116.     RETURN v;
  117.    END;
  118.   END;
  119.   RETURN -1;
  120.  END TestH;
  121.  
  122.  
  123.  
  124. PROCEDURE TestV(VAR w: ARRAY OF CHAR; x,y,len,rlen,ref: INTEGER): INTEGER;
  125.  VAR
  126.   v{R.D6},loop{R.D7}: INTEGER;
  127.  BEGIN
  128.   IF (y+len<=CPCGlobal.ymax) AND (CPCGlobal.text[x,y-1]="\o") AND (CPCGlobal.text[x,y+len+1]="\o") THEN
  129.    v:=0;
  130.    FOR loop:=y TO y+len DO
  131.     IF (w[loop-y]=CPCGlobal.text[x,loop]) THEN
  132.      INC(v);
  133.      IF (CPCGlobal.text[x,loop-1]#"\o") OR (CPCGlobal.text[x,loop+1]#"\o") THEN
  134.       RETURN -1;
  135.      END;
  136.     ELSE
  137.      IF (CPCGlobal.text[x-1,loop]#"\o") OR (CPCGlobal.text[x+1,loop]#"\o") OR (CPCGlobal.text[x,loop]#"\o") THEN
  138.       RETURN -1;
  139.      END;
  140.     END;
  141.    END;
  142.    IF (v>ref) OR
  143.       ((v=ref) AND (ref>0) AND ((len>rlen) OR
  144.                                ((len=rlen) AND (RandomNumber.RND(10)<2)))) THEN
  145.     RETURN v;
  146.    END;
  147.   END;
  148.   RETURN -1;
  149.  END TestV;
  150.  
  151.  
  152.  
  153. PROCEDURE Check(w: ARRAY OF CHAR): BOOLEAN;
  154.  VAR
  155.   loop: INTEGER;
  156.  BEGIN
  157.   FOR loop:=0 TO CPCGlobal.hori+CPCGlobal.vert DO
  158.    IF String.Compare(CPCGlobal.kwr[loop],w)=0 THEN
  159.     RETURN TRUE;
  160.    END;
  161.   END;
  162.   RETURN FALSE;
  163.  END Check;
  164.  
  165.  
  166.  
  167. PROCEDURE Place(a: ARRAY OF CHAR; x,y,len: INTEGER; d: direction);
  168.  VAR
  169.   loop: INTEGER;
  170.  BEGIN
  171.   String.Copy(CPCGlobal.kwr[CPCGlobal.hori+CPCGlobal.vert],a);
  172.   IF (d=horizontal) THEN
  173.    INC(CPCGlobal.hori);
  174.    FOR loop:=x+1 TO x+len+1 DO
  175.     CPCGlobal.text[loop,y+1]:=a[loop-x-1];
  176.    END;
  177.    CPCPrint.SmallPrintAtS(x,y,a);
  178.   ELSE
  179.    INC(CPCGlobal.vert);
  180.    FOR loop:=y+1 TO y+len+1 DO
  181.     CPCGlobal.text[x+1,loop]:=a[loop-y-1];
  182.     CPCPrint.SmallPrintAtC(x,loop-1,a[loop-y-1]);
  183.    END;
  184.   END;
  185.  END Place;
  186.  
  187.  
  188.  
  189. PROCEDURE Status;
  190.  VAR tmp: CPCGlobal.String;
  191.      dummy: BOOLEAN;
  192.      lx,ly: INTEGER;
  193.      cnt: LONGINT;
  194.  BEGIN
  195.   cnt:=0;
  196.   FOR lx:=1 TO CPCGlobal.xmax DO
  197.    FOR ly:=1 TO CPCGlobal.ymax DO
  198.     IF (CPCGlobal.text[lx,ly]#"\o") THEN
  199.      INC(cnt);
  200.     END;
  201.    END;
  202.   END;
  203.   CPCPrint.PrintAtS(CPCGlobal.stat,0,CPCGlobal.msg[26]);
  204.   Conversions.ValToStr(limit,FALSE,tmp,10,2,"0",dummy);
  205.   CPCPrint.Print(tmp,0);
  206.   CPCPrint.PrintAtS(CPCGlobal.stat,1,CPCGlobal.msg[27]);
  207.   Conversions.ValToStr(CPCGlobal.hori,FALSE,tmp,10,2,"0",dummy);
  208.   CPCPrint.Print(tmp,0);
  209.   CPCPrint.PrintAtS(CPCGlobal.stat,2,CPCGlobal.msg[28]);
  210.   Conversions.ValToStr(CPCGlobal.vert,FALSE,tmp,10,2,"0",dummy);
  211.   CPCPrint.Print(tmp,0);
  212.   CPCPrint.PrintAtS(CPCGlobal.stat,3,CPCGlobal.msg[29]);
  213.   Conversions.ValToStr(((cnt*100) DIV (LONGINT(CPCGlobal.xmax*CPCGlobal.ymax))),FALSE,tmp,10,2,"0",dummy);
  214.   CPCPrint.Print(tmp,0);
  215.  
  216.   CPCPrint.SmallPrintAtS(60,10,"Cross Version 4.1");
  217.   CPCPrint.SmallPrintAtS(60,11,"Copyright (C) 1991 by \x80\x81\x82\x83\x84");
  218.   CPCPrint.SmallPrintAtS(60,12,"Cross is Freeware-");
  219.   CPCPrint.SmallPrintAtS(60,13," Copy it, but without profit!");
  220.   CPCPrint.SmallPrintAtS(60,15,"Don't look for Gadgets-");
  221.   CPCPrint.SmallPrintAtS(60,16," Version 4 uses Menus...");
  222.  END Status;
  223.  
  224.  
  225.  
  226. PROCEDURE PutSeedWord(x,y,size,maxsize: INTEGER; dir: direction): BOOLEAN;
  227.  VAR
  228.   word,wlen,counter: INTEGER;
  229.   w: CPCGlobal.String;
  230.  BEGIN
  231.   counter:=0;
  232.   REPEAT
  233.    word:=RandomNumber.RND(num)+1;
  234.    INC(counter);
  235.   UNTIL ((String.Length(CPCGlobal.words[word]^)>=size) AND
  236.         (String.Length(CPCGlobal.words[word]^)<=maxsize)) OR (counter>maxRetry);
  237.   IF counter<=maxRetry THEN
  238.    String.Copy(w,CPCGlobal.words[word]^);
  239.    wlen:=String.Length(w)-1;
  240.    IF dir=horizontal THEN
  241.     WHILE wlen+x>CPCGlobal.xmax DO DEC(x); END;
  242.    ELSE
  243.     WHILE wlen+y>CPCGlobal.ymax DO DEC(y); END;
  244.    END;
  245.    Place(w,x-1,y-1,wlen,dir);
  246.    String.Copy(CPCGlobal.words[word]^,"");
  247.    RETURN TRUE;
  248.   ELSE
  249.    RETURN FALSE;
  250.   END;
  251.  END PutSeedWord;
  252.  
  253.  
  254.  
  255. PROCEDURE NewCrossword;
  256.  VAR
  257.   lx,ly: INTEGER;
  258.  BEGIN
  259.   CPCSleep.SleepPointer;
  260.  
  261.   FOR lx:=1 TO CPCGlobal.maxgrid DO
  262.    FOR ly:=1 TO CPCGlobal.maxgrid DO
  263.     CPCGlobal.text[lx,ly]:="\o";
  264.    END;
  265.   END;
  266.  
  267.   num:=CPCDosIO.ReadWords(TRUE);
  268.   CPCGlobal.hori:=0;
  269.   CPCGlobal.vert:=0;
  270.  
  271.   IntuitionL.ActivateWindow(SYSTEM.CAST(SYSTEM.ADDRESS,CPCGlobal.window));
  272.   IntuitionL.CurrentTime(SYSTEM.ADR(sec),SYSTEM.ADR(micro));
  273.   RandomNumber.PutSeed(sec);
  274.  
  275.   CPCPrint.Cls;
  276.   CPCGlobal.search:=CPCGlobal.off; CPCGlobal.show:=CPCGlobal.on;
  277.  
  278.   CPCMenu.ShowCommands;
  279.   limit:=limitbase;
  280.   Status;
  281.   CPCPrint.ShowAll;
  282.   CPCSleep.NormalPointer;
  283.  END NewCrossword;
  284.  
  285.  
  286.  
  287. PROCEDURE AskCommand;
  288.  VAR cmd: CHAR;
  289.      dummy,length,x,y: INTEGER;
  290.      bdum: BOOLEAN;
  291.      word: CPCGlobal.String;
  292.      dummyStr: ARRAY[0..1] OF CHAR;
  293.      imsg: IntuiIO.IntuiMsg;
  294.      menuID,itemID,subID: INTEGER;
  295.      txt: CPCGlobal.LString;
  296.      numstr: ARRAY[0..20] OF CHAR;
  297.      tmpxm,tmpym: INTEGER;
  298.  BEGIN
  299.   imsg:=IntuiIO.GetMessage(CPCGlobal.window);
  300.   IF imsg=IntuiIO.menuPick THEN
  301.    IntuiIO.GetMenu(CPCGlobal.window,menuID,itemID,subID);
  302.    CASE menuID OF
  303.     |0: CASE itemID OF
  304.          |0: (* new *)
  305.              CPCMenu.AllMenusOff;
  306.              IF CPCRequesters.YesOrNo(CPCGlobal.msg[18]) THEN
  307.               NewCrossword;
  308.              END;
  309.              CPCMenu.ShowCommands;
  310.  
  311.          |1: (* load crossword *)
  312.              CPCMenu.AllMenusOff;
  313.              CPCSleep.SleepPointer;
  314.              CPCDosIO.LoadData;
  315.              CPCPrint.Cls;
  316.              CPCPrint.ShowAll;
  317.              Status;
  318.              CPCSleep.NormalPointer;
  319.              CPCMenu.ShowCommands;
  320.  
  321.          |2: (* load words *)
  322.              CPCMenu.AllMenusOff;
  323.              CPCSleep.SleepPointer;
  324.              num:=CPCDosIO.ReadWords(FALSE);
  325.              CPCPrint.ClrLine(msgline);
  326.              Status;
  327.              CPCSleep.NormalPointer;
  328.              CPCMenu.ShowCommands;
  329.  
  330.          |3: (* save crossword *)
  331.              CPCMenu.AllMenusOff;
  332.              CPCSleep.SleepPointer;
  333.              CPCDosIO.SaveData;
  334.              CPCPrint.ClrLine(msgline);
  335.              CPCSleep.NormalPointer;
  336.              CPCMenu.ShowCommands;
  337.  
  338.          |5: (* quit *)
  339.              CPCMenu.AllMenusOff;
  340.              IF CPCRequesters.YesOrNo(CPCGlobal.msg[50]) THEN
  341.               InOut.WriteLn; InOut.WriteString(CPCGlobal.msg[51]);
  342.               InOut.WriteLn; InOut.WriteLn;
  343.               Arts.Terminate;
  344.              END;
  345.              CPCMenu.ShowCommands;
  346.          |ELSE (* NOP *)
  347.         END;
  348.     |1: CASE itemID OF
  349.          |0: (* auto search mode toggle *)
  350.              IF (CPCGlobal.search=CPCGlobal.on) THEN
  351.               CPCGlobal.search:=CPCGlobal.off;
  352.              ELSE
  353.               CPCGlobal.search:=CPCGlobal.on;
  354.              END;
  355.              CPCMenu.ShowCommands;
  356.  
  357.          |1: (* enter & place manually *)
  358.              CPCMenu.AllMenusOff;
  359.              CPCSleep.SleepPointer;
  360.              CPCPrint.ClrLine(msgline);
  361.              IF (CPCGlobal.xmax>CPCGlobal.ymax) THEN
  362.               length:=CPCGlobal.xmax;
  363.              ELSE
  364.               length:=CPCGlobal.ymax;
  365.              END;
  366.              CPCSleep.NormalPointer;
  367.              CPCRequesters.InputLine(word,CPCGlobal.msg[40],
  368.                        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
  369.                        length);
  370.              CPCSleep.SleepPointer;
  371.              String.CapString(word);
  372.              IF String.Length(word)>0 THEN
  373.               IF Check(word) THEN
  374.                CPCPrint.ClrLine(msgline);
  375.                CPCPrint.Print(CPCGlobal.msg[41],0);
  376.               ELSE
  377.                x:=1;
  378.                y:=1;
  379.                CPCPrint.ClrLine(msgline);
  380.                CPCPrint.Print(CPCGlobal.msg[42],0);
  381.                IntuiIO.AddIntuiMsg(CPCGlobal.window,IntuiIO.IntuiMsgSet{IntuiIO.mouseButtons});
  382.                CPCSleep.NormalPointer;
  383.                REPEAT
  384.                 REPEAT
  385.                  imsg:=IntuiIO.GetMessage(CPCGlobal.window);
  386.                 UNTIL imsg=IntuiIO.mouseButtons;
  387.                 x:=IntuiIO.GetMouse(CPCGlobal.window,IntuiIO.curentX);
  388.                 y:=IntuiIO.GetMouse(CPCGlobal.window,IntuiIO.curentY);
  389.                 CPCPrint.CharPos(x,y);
  390.                UNTIL (x>=0) AND (y>=0);
  391.                CPCSleep.SleepPointer;
  392.                CPCPrint.ClrLine(msgline);
  393.  
  394.                CPCSleep.NormalPointer;
  395.                IF CPCRequesters.HoriOrVert(CPCGlobal.msg[43]) THEN
  396.                 IF (TestH(word,x+1,y+1,String.Length(word)-1,0,-1)>=0) THEN
  397.                  CPCSleep.SleepPointer;
  398.                  Place(word,x,y,String.Length(word)-1,horizontal);
  399.                  CPCPrint.ClrLine(msgline);
  400.                 ELSE
  401.                  CPCSleep.SleepPointer;
  402.                  CPCPrint.ClrLine(msgline);
  403.                  CPCPrint.Print(CPCGlobal.msg[44],0);
  404.                 END;
  405.                ELSE
  406.                 IF (TestV(word,x+1,y+1,String.Length(word)-1,0,-1)>=0) THEN
  407.                  Place(word,x,y,String.Length(word)-1,vertical);
  408.                  CPCPrint.ClrLine(msgline);
  409.                 ELSE
  410.                  CPCPrint.ClrLine(msgline);
  411.                  CPCPrint.Print(CPCGlobal.msg[44],0);
  412.                 END;
  413.                END;
  414.               END;
  415.              END;
  416.              Status;
  417.              CPCPrint.ShowAll;
  418.              CPCSleep.NormalPointer;
  419.              CPCMenu.ShowCommands;
  420.  
  421.          |2: (* reset limit *)
  422.              CPCPrint.ClrLine(msgline);
  423.              limit:=limitbase;
  424.              CPCPrint.Print(CPCGlobal.msg[49],0);
  425.              Status;
  426.  
  427.          |3: (* set size *)
  428.              CPCMenu.AllMenusOff;
  429.              CPCSleep.SleepPointer;
  430.              CPCPrint.ClrLine(msgline);
  431.  
  432.              String.Copy(txt,CPCGlobal.msg[88]);
  433.              Conversions.ValToStr(lowerxlimit,FALSE,numstr,10,0,"0",bdum);
  434.              String.Concat(txt,numstr);
  435.              String.Concat(txt,"...");
  436.              Conversions.ValToStr(upperxlimit,FALSE,numstr,10,0,"0",bdum);
  437.              String.Concat(txt,numstr);
  438.              String.Concat(txt,"):");
  439.              CPCSleep.NormalPointer;
  440.              tmpxm:=CPCRequesters.InputNum(txt,lowerxlimit,upperxlimit,
  441.                                            CPCGlobal.xmax,TRUE);
  442.              CPCSleep.SleepPointer;
  443.              IF tmpxm>0 THEN
  444.               String.Copy(txt,CPCGlobal.msg[89]);
  445.               Conversions.ValToStr(lowerylimit,FALSE,numstr,10,0,"0",bdum);
  446.               String.Concat(txt,numstr);
  447.               String.Concat(txt,"...");
  448.               Conversions.ValToStr(upperylimit,FALSE,numstr,10,0,"0",bdum);
  449.               String.Concat(txt,numstr);
  450.               String.Concat(txt,"):");
  451.               CPCSleep.NormalPointer;
  452.               tmpym:=CPCRequesters.InputNum(txt,lowerylimit,upperylimit,
  453.                                             CPCGlobal.ymax,TRUE);
  454.               CPCSleep.SleepPointer;
  455.               IF tmpym>0 THEN
  456.                CPCGlobal.xmax:=tmpxm;
  457.                CPCGlobal.ymax:=tmpym;
  458.               END;
  459.              END;
  460.  
  461.              CPCPrint.Cls;
  462.              Status;
  463.              CPCPrint.ShowAll;
  464.              CPCSleep.NormalPointer;
  465.              CPCMenu.ShowCommands;
  466.  
  467.          |4: (* put seed words *)
  468.              CPCMenu.AllMenusOff;
  469.              CPCSleep.SleepPointer;
  470.              CPCPrint.ClrLine(msgline);
  471.  
  472.              IF (num>=4) THEN
  473.               cmp:=10;
  474.               IF (cmp>CPCGlobal.xmax-2) THEN
  475.                cmp:=CPCGlobal.xmax-2;
  476.               END;
  477.               IF PutSeedWord(1,1,cmp,CPCGlobal.xmax-2,horizontal) THEN
  478.                IF PutSeedWord(CPCGlobal.xmax,CPCGlobal.ymax,cmp,CPCGlobal.xmax-2,horizontal) THEN
  479.                 cmp:=10;
  480.                 IF (cmp>CPCGlobal.ymax-2) THEN
  481.                  cmp:=CPCGlobal.ymax-2;
  482.                 END;
  483.                 IF PutSeedWord(CPCGlobal.xmax,1,cmp,CPCGlobal.ymax-2,vertical) THEN
  484.                  IF PutSeedWord(1,CPCGlobal.ymax,cmp,CPCGlobal.ymax-2,vertical) THEN
  485.                   (* NOP *)
  486.                  END;
  487.                 END;
  488.                END;
  489.               END;
  490.              END;
  491.  
  492.              Status;
  493.              CPCPrint.ShowAll;
  494.              CPCSleep.NormalPointer;
  495.              CPCMenu.ShowCommands;
  496.  
  497.          |ELSE (* NOP *)
  498.         END;
  499.     |2: CASE itemID OF
  500.          |0: (* print crossword puzzle (plain) *)
  501.              CPCMenu.AllMenusOff;
  502.              CPCSleep.SleepPointer;
  503.              CPCPrint.ClrLine(msgline);
  504.              CPCPrint.Print(CPCGlobal.msg[46],0);
  505.              CPCDosIO.PrintPlainCross;
  506.              CPCPrint.ClrLine(msgline);
  507.              CPCSleep.NormalPointer;
  508.              CPCMenu.ShowCommands;
  509.  
  510.          |1: (* print crossword puzzle (TeX) *)
  511.              CPCMenu.AllMenusOff;
  512.              CPCSleep.SleepPointer;
  513.              CPCPrint.ClrLine(msgline);
  514.              CPCPrint.Print(CPCGlobal.msg[46],0);
  515.              CPCDosIO.PrintTexCross;
  516.              CPCPrint.ClrLine(msgline);
  517.              CPCSleep.NormalPointer;
  518.              CPCMenu.ShowCommands;
  519.  
  520.          |2: (* print crossword puzzle (fancy) *)
  521.              CPCMenu.AllMenusOff;
  522.              CPCSleep.SleepPointer;
  523.              CPCPrint.ClrLine(msgline);
  524.              CPCPrint.Print(CPCGlobal.msg[46],0);
  525.              CPCDosIO.PrintFancyCross;
  526.              CPCPrint.ClrLine(msgline);
  527.              CPCSleep.NormalPointer;
  528.              CPCMenu.ShowCommands;
  529.  
  530.          |3: (* print crossword puzzle (Epson) *)
  531.              CPCMenu.AllMenusOff;
  532.              CPCSleep.SleepPointer;
  533.              CPCPrint.ClrLine(msgline);
  534.              CPCPrint.Print(CPCGlobal.msg[46],0);
  535.              CPCDosIO.PrintEpsonCross;
  536.              CPCPrint.ClrLine(msgline);
  537.              CPCSleep.NormalPointer;
  538.              CPCMenu.ShowCommands;
  539.  
  540.          |4: (* print crossword solution *)
  541.              CPCMenu.AllMenusOff;
  542.              CPCSleep.SleepPointer;
  543.              CPCPrint.ClrLine(msgline);
  544.              CPCPrint.Print(CPCGlobal.msg[47],0);
  545.              CPCDosIO.PrintSolution;
  546.              CPCPrint.ClrLine(msgline);
  547.              CPCSleep.NormalPointer;
  548.              CPCMenu.ShowCommands;
  549.          |ELSE (* NOP *)
  550.         END;
  551.     |ELSE (* NOP *)
  552.    END;
  553.   END;
  554.  END AskCommand;
  555.  
  556.  
  557.  
  558. BEGIN
  559.  Break.InstallException;
  560.  scrname:=progtitle;
  561.  narg:=Arguments.NumArgs();
  562.  CPCGlobal.xmax:=-1;
  563.  CPCGlobal.ymax:=-1;
  564.  msgmd:=CPCDosIO.nonumbers;
  565.  
  566.  ibase:=IntuitionL.intuitionBase;
  567.  IF (ibase^.firstScreen#NIL) THEN
  568.   (* try to figure out if this is a PAL or NTSC machine: *)
  569.   (* look at the "height" field of first screen and hope there's any *)
  570.   (* significance to this value *)
  571.   intuiHeight:=ibase^.firstScreen^.height;
  572.   IF (intuiHeight>=512) OR ((intuiHeight>=256) AND (intuiHeight<400)) THEN
  573.    (* this is pal resolution *)
  574.    upperylimit:=35;
  575.    defmsgline:=27;
  576.    pal:=TRUE;
  577.   ELSE
  578.    (* anything else means "not pal" *)
  579.    upperylimit:=25;
  580.    defmsgline:=20;
  581.    pal:=FALSE;
  582.    lace:=FALSE;
  583.   END;
  584.  ELSE
  585.   (* there's probably no use showing any error messages if there's no *)
  586.   (* screen present at all... i guess this will never be executed anyway *)
  587.   Arts.Terminate;
  588.  END;
  589.  
  590.  IF NOT Arts.wbStarted THEN
  591.   FOR loop:=1 TO narg DO
  592.    Arguments.GetArg(loop,tmp,dummy);
  593.    IF (tmp[0]="-") THEN
  594.     tmp[0]:="0";
  595.     CASE tmp[1] OF
  596.      |"x","X": tmp[1]:="0";
  597.                CPCGlobal.xmax:=CPCDosIO.Value(tmp);
  598.                IF ((CPCGlobal.xmax<lowerxlimit) OR (CPCGlobal.xmax>upperxlimit) OR (ODD(CPCGlobal.xmax+1))) THEN
  599.                 CPCGlobal.xmax:=-1;
  600.                 InOut.WriteString("Illegal value for "+"XSIZE"+"; assuming default value\n");
  601.                END;
  602.      |"y","Y": tmp[1]:="0";
  603.                CPCGlobal.ymax:=CPCDosIO.Value(tmp);
  604.                IF ((CPCGlobal.ymax<lowerylimit) OR (CPCGlobal.ymax>upperylimit) OR (ODD(CPCGlobal.ymax+1))) THEN
  605.                 CPCGlobal.ymax:=-1;
  606.                 InOut.WriteString("Illegal value for "+"YSIZE"+"; assuming default value\n");
  607.                END;
  608.      |"d","D": msgmd:=CPCDosIO.numbers;
  609.      |ELSE
  610.     END;
  611.    END;
  612.   END;
  613. (*-------------------- manual sizing if wbstarted... no longer needed! -----------
  614.  ELSE
  615.   InOut.WriteString("\n\nXSIZE("); InOut.WriteInt(lowerxlimit,0);
  616.   InOut.WriteString(".."); InOut.WriteInt(upperxlimit,0);
  617.   InOut.WriteString(")="); InOut.ReadInt(CPCGlobal.xmax);
  618.   IF ((CPCGlobal.xmax<lowerxlimit) OR (CPCGlobal.xmax>upperxlimit) OR
  619.       (ODD(CPCGlobal.xmax+1))) THEN
  620.    CPCGlobal.xmax:=-1;
  621.    InOut.WriteString("Illegal value for "+"XSIZE"+"; assuming default value\n");
  622.   END;
  623.   InOut.WriteString("\n\nYSIZE("); InOut.WriteInt(lowerylimit,0);
  624.   InOut.WriteString(".."); InOut.WriteInt(upperylimit,0);
  625.   InOut.WriteString(")="); InOut.ReadInt(CPCGlobal.ymax);
  626.   IF ((CPCGlobal.ymax<lowerylimit) OR (CPCGlobal.ymax>upperylimit) OR
  627.       (ODD(CPCGlobal.ymax+1))) THEN
  628.    CPCGlobal.ymax:=-1;
  629.    InOut.WriteString("Illegal value for "+"YSIZE"+"; assuming default value\n");
  630.   END;
  631.   --------------------------------------------------------------------------------*)
  632.  END;
  633.  
  634.  Arguments.GetArg(0,progname,dummy);
  635.  IF (CPCGlobal.xmax=-1) THEN
  636.   CPCGlobal.xmax:=defxsize;
  637.  END;
  638.  IF (CPCGlobal.ymax=-1) THEN
  639.   CPCGlobal.ymax:=defysize;
  640.  END;
  641.  Arguments.GetArg(1,tmp,dummy);
  642.  IF (tmp[0]="?") THEN
  643.   InOut.WriteString("\n"+progtitle+"\n");
  644.   InOut.WriteString(underl);
  645.   InOut.WriteString("\nCopyright ©1991 by Jürgen Weinelt, Zur Kanzel 1, D-8783 Hammelburg, Germany.\n\n");
  646.   InOut.WriteString("Please Note: CPC is FREEWARE; you may copy it, but do not sell it!\n\n");
  647.   InOut.WriteString("Usage:\n");
  648.   InOut.WriteString(progname); InOut.WriteString(" [?] [-xXSIZE] [-yYSIZE] [-d]\n");
  649.   InOut.WriteString(" XSIZE: xsize in chars, ");
  650.   InOut.WriteInt(lowerxlimit,0); InOut.WriteString("<=x<=");
  651.   InOut.WriteInt(upperxlimit,0); InOut.WriteString(", default: ");
  652.   InOut.WriteInt(defxsize,0);
  653.   InOut.WriteString("\n YSIZE: ysize in chars, ");
  654.   InOut.WriteInt(lowerylimit,0); InOut.WriteString("<=y<=");
  655.   InOut.WriteInt(upperylimit,0); InOut.WriteString(", default: ");
  656.   InOut.WriteInt(defysize,0);
  657.   InOut.WriteString("\n -d:    turn on message numbers (for word file debugging only!)\n");
  658.   InOut.WriteString("Please note: XSIZE and YSIZE must be odd!\n\n");
  659.  END;
  660.  
  661.  IF (tmp[0]#"?") THEN
  662.   CPCDosIO.ReadMsg(msgmd);
  663.  
  664.   IF pal THEN
  665.    CPCGlobal.screen:=IntuiIO.OpenScreen(scrname,0,0,640,256,1,IntuiIO.ScreenTypeSet{IntuiIO.hires});
  666.   ELSE
  667.    CPCGlobal.screen:=IntuiIO.OpenScreen(scrname,0,0,640,200,1,IntuiIO.ScreenTypeSet{IntuiIO.hires});
  668.   END;
  669.   Arts.Assert(CPCGlobal.screen#NIL,SYSTEM.ADR(CPCGlobal.msg[52]));
  670.  
  671.   CPCGlobal.viewport:=IntuiIO.GetViewPort(CPCGlobal.screen);
  672.   GraphicsL.SetRGB4(CPCGlobal.viewport, 0,  0, 0, 0);  (* screen background *)
  673.   GraphicsL.SetRGB4(CPCGlobal.viewport, 1, 15,15,15);  (* screen foreground *)
  674.   GraphicsL.SetRGB4(CPCGlobal.viewport,17,  6, 6, 6);  (* pointer color #1  *)
  675.   GraphicsL.SetRGB4(CPCGlobal.viewport,18, 11,11,11);  (* pointer color #2  *)
  676.   GraphicsL.SetRGB4(CPCGlobal.viewport,19, 15,15,15);  (* right. it's #3... *)
  677.  
  678.  
  679.   IF pal THEN
  680.    CPCGlobal.window:=IntuiIO.OpenWindow(scrname,0,0,640,256,
  681.                       IntuiIO.WindowTypeSet{IntuiIO.activWindow,IntuiIO.backDrop,IntuiIO.borderless},CPCGlobal.screen);
  682.   ELSE
  683.    CPCGlobal.window:=IntuiIO.OpenWindow(scrname,0,0,640,200,
  684.                       IntuiIO.WindowTypeSet{IntuiIO.activWindow,IntuiIO.backDrop,IntuiIO.borderless},CPCGlobal.screen);
  685.   END;
  686.   Arts.Assert(CPCGlobal.window#NIL,SYSTEM.ADR(CPCGlobal.msg[61]));
  687.   CPCGlobal.rastport:=IntuiIO.WindowRastPort(CPCGlobal.window);
  688.   CPCGlobal.topaz:=CPCGlobal.rastport^.font;
  689.   IntuiIO.AddIntuiMsg(CPCGlobal.window,IntuiIO.IntuiMsgSet{IntuiIO.menuPick});
  690.   CPCDosIO.InitCPCDosIO;
  691.  
  692.   msgline:=defmsgline;
  693.  
  694.   CPCPrint.Print("",1);
  695.   CPCPrint.Print(progtitle,1);
  696.   CPCPrint.Print(underl,2);
  697.   CPCPrint.Print("©1991 by",1);
  698.   CPCPrint.Print("Jürgen Weinelt",1);
  699.   CPCPrint.Print("Zur Kanzel 1",1);
  700.   CPCPrint.Print("D-8783 Hammelburg",1);
  701.   CPCPrint.Print("Germany",2);
  702.  
  703.   CPCPrint.Print("Last changed: 15-Aug-91",2);
  704.  
  705.   CPCPrint.Print("Please note: CPC is FREEWARE; you may copy it, but without making profit!",2);
  706.  
  707.   CPCPrint.Print("This program was created using M2Amiga and the IntuitionReport and",1);
  708.   CPCPrint.Print("GraphicsReport support libraries. Thanks to A+L for these powerful tools.",2);
  709.  
  710.   CPCPrint.Print("Special thanks to the ARP people for their file requester.",2);
  711.  
  712.   CPCPrint.Print(CPCGlobal.msg[62],0);
  713.  
  714.   NewCrossword;
  715.  
  716.   (* main loop is "endless"; termination via Assert *)
  717.   (* in procedure AskCommand                        *)
  718.   LOOP
  719.    val0:=-1; len0:=0;
  720.    IF (CPCGlobal.show=CPCGlobal.off) THEN
  721.     CPCGlobal.show:=CPCGlobal.on;
  722.     CPCMenu.ShowCommands;
  723.    END;
  724.    AskCommand;
  725.    IF (CPCGlobal.search=CPCGlobal.on) THEN
  726.     CPCGlobal.show:=CPCGlobal.off;
  727.     FOR outerloop:=0 TO num DO
  728.      word:=outerloop;
  729.      String.Copy(w,CPCGlobal.words[word]^);
  730.      AskCommand;
  731.      IF (String.Length(w)>0) THEN
  732.       wlen:=String.Length(w)-1;
  733.       IF (wlen<limit) OR (wlen>limit+4) OR
  734.          (wlen+1<val0+val0) OR (wlen<=0) THEN
  735.        (* NOP *)
  736.       ELSIF Check(w) THEN
  737.        String.Copy(CPCGlobal.words[word]^,"");
  738.       ELSE
  739.        FOR xloop:=1 TO CPCGlobal.xmax DO
  740.         IF ((xloop MOD 2)=1) OR (limit<2) THEN
  741.          doH:=(xloop+wlen<=CPCGlobal.xmax);
  742.          FOR yloop:=1 TO CPCGlobal.ymax DO
  743.           IF ((yloop MOD 2)=1) OR (limit<2) THEN
  744.            tempH:=-1; tempV:=-1;
  745.            IF (doH) THEN
  746.             tempH:=TestH(w,xloop,yloop,wlen,len0,val0);
  747.            END;
  748.            IF (yloop+wlen<=CPCGlobal.ymax) THEN
  749.             tempV:=TestV(w,xloop,yloop,wlen,len0,val0);
  750.            END;
  751.            IF (tempH#-1) AND (tempH>=tempV) THEN
  752.             val0:=tempH; x0:=xloop; y0:=yloop;
  753.             w0:=word; dir0:=horizontal; len0:=wlen;
  754.             CPCPrint.ClrLine(msgline);
  755.             CPCPrint.Print(w,0);
  756.            ELSIF (tempV#-1) THEN
  757.             val0:=tempV; x0:=xloop; y0:=yloop;
  758.             w0:=word; dir0:=vertical; len0:=wlen;
  759.             CPCPrint.ClrLine(msgline);
  760.             CPCPrint.Print(w,0);
  761.            END;
  762.           END;
  763.          END;
  764.         END;
  765.        END;
  766.       END;
  767.      END;
  768.     END;
  769.  
  770.     IF (val0>=1) THEN
  771.      Place(CPCGlobal.words[w0]^,x0-1,y0-1,String.Length(CPCGlobal.words[w0]^)-1,dir0);
  772.      CPCPrint.ClrLine(msgline);
  773.      CPCPrint.Print(CPCGlobal.words[w0]^,0);
  774.      CPCPrint.Print(CPCGlobal.msg[64],0);
  775.      String.Copy(CPCGlobal.words[w0]^,"");
  776.     ELSE
  777.      IF (limit>1) THEN
  778.       DEC(limit,2);
  779.      ELSE
  780.       CPCPrint.ClrLine(msgline);
  781.       CPCPrint.Print(CPCGlobal.msg[65],0);
  782.       CPCGlobal.search:=CPCGlobal.off;
  783.      END;
  784.     END;
  785.     Status;
  786.    END;
  787.   END;
  788.  END;
  789. CLOSE
  790.  (* window and screen are closed in module "CPCMenu", it can't be done here!!! *)
  791. END Cross.
  792.